package org.jeecg.modules.app.utils;

/**
 * @author by Administrator
 * @desc:
 * @since 2024-09-13 星期五 15:30:20
 */
public class VersionUtils {

    /**
     * 比较两个版本号字符串
     *
     * @param version1 第一个版本号
     * @param version2 第二个版本号
     * @return 如果 version1 > version2 返回正数，如果 version1 < version2 返回负数，如果相等返回0
     */
    public static int compareVersions(String version1, String version2) {
        String[] parts1 = version1.split("\\.");
        String[] parts2 = version2.split("\\.");

        int length = Math.max(parts1.length, parts2.length);

        for (int i = 0; i < length; i++) {
            int num1 = i < parts1.length ? Integer.parseInt(parts1[i]) : 0;
            int num2 = i < parts2.length ? Integer.parseInt(parts2[i]) : 0;

            if (num1 > num2) {
                return 1;
            } else if (num1 < num2) {
                return -1;
            }
        }

        return 0; // 所有部分都相等
    }

    /**
     * 比较两个流水号字符串所表示的数字大小，特别处理 null 和空字符串
     *
     * @param serialNum1 第一个流水号
     * @param serialNum2 第二个流水号
     * @return 如果 serialNum1 > serialNum2 返回正数，如果 serialNum1 < serialNum2 返回负数，如果相等返回0
     */
    public static int compareSerialNumbers(String serialNum1, String serialNum2) {
        // 处理 null 和 "" 的情况
        if (serialNum1 == null) {
            return serialNum2 == null ? 0 : (serialNum2.isEmpty() ? 0 : -1);
        }
        if (serialNum2 == null) {
            return serialNum1.isEmpty() ? 0 : 1;
        }
        if (serialNum1.isEmpty()) {
            return serialNum2.isEmpty() ? 0 : -1;
        }
        if (serialNum2.isEmpty()) {
            return 1;
        }

        // 此时两个字符串都非 null 且非空，可以安全地转换为整数进行比较
        try {
            int num1 = Integer.parseInt(serialNum1);
            int num2 = Integer.parseInt(serialNum2);
            return Integer.compare(num1, num2);
        } catch (NumberFormatException e) {
            // 理论上这里不应该抛出异常，因为前面的逻辑已经确保了字符串是非空的
            // 但为了代码的健壮性，还是保留了这个捕获块
            // 注意：在实际应用中，应该更清晰地处理这种情况，比如抛出一个更有意义的异常
            throw new IllegalStateException("Unexpected non-integer serial number", e);
        }
    }

    public static void main(String[] args) {
        System.out.println(compareVersions("1.0.1", "1.0.0")); // 应输出正数
        System.out.println(compareVersions("1.1.0", "1.0.11")); // 应输出正数
        System.out.println(compareVersions("1.0.11", "1.0.11")); // 应输出0

        System.out.println(compareSerialNumbers("002", "001")); // 应输出正数
        System.out.println(compareSerialNumbers("012", "003")); // 应输出正数
        System.out.println(compareSerialNumbers("003", "003")); // 应输出0
    }

}
